//
//  UITextView+Emoticon.swift
//  表情键盘-新建项目
//
//  Created by zhangping on 15/10/22.
//  Copyright © 2015年 zhangping. All rights reserved.
//

import UIKit

// MARK: - 扩展UITextView,处理插入表情,和将表情图片转换成表情文本
extension UITextView {
    /// 获取带表情图片的文本字符串
    func emoticonText() -> String {
        // 拼接后的字符串
        var strM = ""
        // 遍历获取属性文本里面的每一段,将每一段拼接起来
        attributedText.enumerateAttributesInRange(NSRange(location: 0, length: attributedText.length), options: NSAttributedStringEnumerationOptions(rawValue: 0), usingBlock: { (dict, range, _) -> Void in

            // 判断是否是附件, 如果是附件,获取名称
            if let attachmet = dict["NSAttachment"] as? CZTextAttachment {
                strM += attachmet.name!
            } else {
                // 不是附件,截取对应的文本
                let str = (self.attributedText.string as NSString).substringWithRange(range)
                strM += str
            }
        })

        return strM
    }
    
    /**
    插入表情
    - parameter emoticon: 表情模型
    */
    func insertEmoticon(emoticon: CZEmoticon) {
        // 判断如果点击的是删除按钮,删除文字
        if emoticon.removeEmoticon {
            deleteBackward()
        }
        
        // 插入emoji
        if let emoji = emoticon.emoji {
            insertText(emoji)
//            print("插入emoji: \(text)")
        }
        
        // 插入表情图片,需要使用到属性文本
        if let pngPath = emoticon.pngPath {
            // 附件,图片可以作为附件,附件可以添加到属性文本
            let attachment = CZTextAttachment()
            attachment.image = UIImage(contentsOfFile: pngPath)
            
            // 将表情图片的名称保存在附件里面
            attachment.name = emoticon.chs
            
            // 获取文本的高度
            let height = font?.lineHeight ?? 10
            
            // 设置附件的大小
            attachment.bounds = CGRect(x: 0, y: -4, width: height, height: height)
            
            // 创建带附件的属性文本,并且添加font属性
            let attrString = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
            attrString.addAttribute(NSFontAttributeName, value: font!, range: NSRange(location: 0, length: 1))
            
            // 获取textView现有文本
            let attrStringM = NSMutableAttributedString(attributedString: attributedText)
            
            // 光标位置
            let selectedRange = self.selectedRange
            
            // 替换属性文本到对应的位置
            attrStringM.replaceCharactersInRange(selectedRange, withAttributedString: attrString)
            
            // 将属性文本设置给textView
            attributedText = attrStringM
            
            // 重新设置光标位置
            self.selectedRange = NSRange(location: selectedRange.location + 1, length: 0)
            
            // 主动调用 textViewDidChange
            delegate?.textViewDidChange!(self)
            
            // 主动发送 UITextViewTextDidChangeNotification 通知
            NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self)
        }
    }
}
